/*
 * 描述： <描述>
 * 修改人： rain
 * 修改时间： 2016年9月29日
 * 项目： rainhy-auth
 */
package com.rainhy.auth.authchecker;

import java.util.Collection;

import org.apache.commons.collections.CollectionUtils;
import org.joda.time.DateTime;
import org.springframework.core.Ordered;

import com.rainhy.auth.context.AuthChecker;
import com.rainhy.auth.context.AuthItemRef;

/**
 * 
 * 基础权限核查器<br/>
 * 用以支持权限检测
 * 
 * @author rain
 * @version [版本号, 2016年9月29日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public abstract class BaseAuthChecker implements AuthChecker {
    
    @Override
    public String authType() {
        return null;
    }
    
    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE;
    }
    
    @Override
    public boolean hasAuth(Collection<AuthItemRef> authItemRefs, Object... objects) {
        if (CollectionUtils.isNotEmpty(authItemRefs)) {
            DateTime now = DateTime.now();
            for (AuthItemRef authItemRefTemp : authItemRefs) {
                DateTime effectiveDate = authItemRefTemp.getEffectiveDate();
                DateTime invalidDate = authItemRefTemp.getInvalidDate();
                
                if ((effectiveDate != null && now.compareTo(effectiveDate) < 0) // 当前时间小于生效时间(权限还没有生效)
                        || (invalidDate != null && now.compareTo(invalidDate) > 0)  // 当前时间大于失效时间(权限过期)
                ) {
                    continue;
                }
                
                if (hasAuth(authItemRefTemp, objects)) {
                    return true;
                }
            }
        }
        return false;
    }
    
    /**
     * 鉴权是否成功
     * 
     * @param authItemRefs
     * @param objects 额外参数
     * 
     * @return boolean 鉴权成功
     * @exception throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     */
    protected abstract boolean hasAuth(AuthItemRef authItemRef, Object... objects);
}
